const bcrypt = require("bcryptjs");

/**
 * 通用函数封装
 * @auther
 * @time 2021/07/28 22:07
 */
const os = require("os");
const CODE = {
  SUCCESS: 200, // 成功
  PARAM_ERROR: 10001, // 参数错误
  USER_ACCOUNT_ERROR: 20001, // 账号或密码错误
  USER_LOGIN_ERROR: 30001, // 用户未登录
  BUSINESS_ERROR: 40001, // 业务请求失败
  AUTH_ERROR: 50001, // 认证失败或TOKEN过期
  SYSTEM_INIT_ERROR: 60001, // 系统初始化失败
};

function arrayToTree(array, parent_id) {
  let result = [];
  array.forEach((item) => {
    if (item.parent_id == parent_id) {
      let children = arrayToTree(array, item.menu_id);
      if (Array.isArray(children) && children.length) {
        item.children = children;
        item.alwaysShow = true;
      }
      result.push(item);
    }
  });
  return result;
}

/**
   * 获取指定节点的所有子孙节点
   * @param {Array} nodes 节点数组
   * @param {number|string} id 指定节点 ID
   * @returns {Array} 所有子孙节点
   */
const getDescendants = function (nodes, id) {
  // 获取该节点的所有子节点
  const childNodes = nodes.filter((n) => n.parent_id === id);
  // 如果没有子节点，则返回空数组
  if (childNodes.length === 0) {
    return [];
  }
  // 递归地获取每个子节点的子孙节点，并将它们拼接到当前数组中
  return childNodes.concat(
    childNodes.map((node) => getDescendants(nodes, node.id)).flat()
  );
}

module.exports = {
  /**
   * 分页结构封装
   * @param { number } pageNum        每页数量
   * @param { number } pageSize       当前页码
   */
  pager({ pageNum = 1, pageSize = 1 }) {
    pageNum *= 1;
    pageSize *= 1;
    const skipIndex = (pageNum - 1) * pageSize; // 当前所翻页数
    return {
      page: {
        pageNum,
        pageSize,
      },
      skipIndex,
    };
  },

  // 成功回调
  success(data = "", msg = "", code = CODE.SUCCESS) {
    // logger.debug(data);
    return { code, data, msg };
  },

  // 失败回调
  fail(data = "", msg = "", code = CODE.BUSINESS_ERROR) {
    // logger.debug(msg);
    return { code, data, msg };
  },

  // 获取Ip地址
  getIPv4() {
    //同一接口可能有不止一个IP4v地址，所以用数组存
    let ipv4s = [];
    //获取网络接口列表对象
    let interfaces = os.networkInterfaces();
    Object.keys(interfaces).forEach(function (key) {
      interfaces[key].forEach(function (item) {
        //跳过IPv6 和 '127.0.0.1'
        if ("IPv4" !== item.family || item.internal !== false) return;
        ipv4s.push(item.address); //可用的ipv4s加入数组
        // console.log(key + '--' + item.address);
      });
    });
    return ipv4s[0]; //返回一个可用的即可
  },

  getClientIp(req) {
    let ip =
      req.headers["x-real-ip"] ||
      req.headers["x-forwarded-for"] ||
      req.connection.remoteAddres ||
      req.socket.remoteAddress ||
      "";
    if (ip.split(",").length > 0) {
      ip = ip.split(",")[0];
    }
    return ip;
  },
  /**
   * @description: 加密处理
   * @param password {原密码}
   * @param saltTimes {加盐次数}
   * @return: 加密信息
   */
  async encrypt(password, saltTimes) {
    hash = await bcrypt.hashSync(password, saltTimes);
    return hash;
  },

  /**
   * @description: 密码验证
   * @param password 原密码
   * @param hash 加密密码
   * @return:
   */
  async validate(password, hash) {
    const match = await bcrypt.compare(password, hash);
    return match;
  },
  // 把状态码暴露全局
  CODE,
  routerTree(router) {
    if (!Array.isArray(router) || router.length === 0) {
      return [];
    }
    let data = router.map((item) => {
      return {
        menu_id: item.menu_id,
        parent_id: item.parent_id,
        name: item.is_frame
          ? item.path
          : item.path.charAt(0).toUpperCase() + item.path.slice(1),
        path: (item.component === null ? "/" : "") + item.path,
        hidden: !item.visible,
        component: item.component === null ? "Layout" : item.component,
        meta: {
          title: item.menu_name,
          icon: item.icon,
          noCache: !item.is_cache,
          link: item.is_frame ? item.path : null,
        },
      };
    });
    let menu = arrayToTree(data, 0);
    return menu;
  },
  getDescendants:getDescendants
};
